#include <stdio.h>
#include <stdbool.h>

bool isAnagram(char* s, char* t) {
    int hash[26] = {0};
    while (*s)
        hash[*s++ -'a']++;

    while (*t)
        hash[*t++ -'a']--;

    // 如果有不为0的，说明该字符数量在s和t中有差异
    for (int i = 0; i < 26; i++)
        if (hash[i] != 0)
            return false;

    return true;
}


// 优化一下, 只用一个循环。
// 不过这种优化没什么卵用，时钟记住：算法的质量提升必须得有数量级，否则没用
bool isAnagram2(char* s, char* t) {
    int hash[26] = {0};

    while (*s && *t) {
        hash[*s++ -'a']++;
        hash[*t++ -'a']--;
    }
    if (*s != *t) // 两个不是同时结束的，不是NULL，则长度都不一样，肯定是false
        return false;

    // 如果有不为0的，说明该字符数量在s和t中有差异
    for (int i = 0; i < 26; i++)
        if (hash[i] != 0)
            return false;

    return true;
}

int main(void)
{
    printf("#242. 有效的字母异位词\n");

    printf("\n这道题是简单题，但是还是很有必要拿出来说说：\n");
    printf("\n首先看到它时，知道是哈希题，想着用c语言做不了，用python的dict做。其实错了\n");
    printf("简单的哈希，我们可以完全临时用数组构造一个哈希表，用一个很简单的哈希值计算方法去数组索引。\n");

    printf("\n 比如这个题，定义一个长度为26的数组（字母最多有26个），ascii值相对于'a'的偏移作为索引，就可以很简单用c实现\n");

    char *s = "anagram", *t = "nagaram";
    printf("\n\nans: %s\n", isAnagram(s, t) ? "true" : "false");
    printf("ans2: %s\n", isAnagram2(s, t) ? "true" : "false");
    return 0;
}